#include "mq_connection.hpp"

// 消息确认需要用到channel
void cb(lywmq::Channel::ptr &channel, const std::string consumer_tag, const lywmq::BasicProperties *bp, const std::string &body)
{
    std::cout << consumer_tag << "消费了消息：" << body << std::endl;
    channel->basicAck(bp->id());
}

int main(int argc, char* argv[])
{
    if (argc != 2)
    {
        DLOG("usage: ./consume_client queue_name");
        return -1;
    }
    // 实例化异步工作线程对象
    lywmq::AsyncWorker::ptr awp = std::make_shared<lywmq::AsyncWorker>();
    // 实例化连接对象
    lywmq::Connection::ptr conn = std::make_shared<lywmq::Connection>("127.0.0.1", 8080, awp);
    // 创建信道
    lywmq::Channel::ptr channel = conn->openChannel();
    // 声明交换机&队列
    google::protobuf::Map<std::string, std::string> tmp_map;
    channel->declareExchange("exchange1", lywmq::ExchangeType::TOPIC, true, false, tmp_map);
    channel->declareQueue("queue1", true, false, false, tmp_map);
    channel->declareQueue("queue2", true, false, false, tmp_map);
    // 绑定
    channel->queueBind("exchange1", "queue1", "queue1");
    channel->queueBind("exchange1", "queue2", "news.music.#");
    // 订阅
    auto functor = std::bind(cb, channel, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
    channel->basicConsume("consumer1", argv[1], false, functor);

    while (1) std::this_thread::sleep_for(std::chrono::seconds(3)); // 当前线程循环休眠3秒

    // 关闭信道
    conn->closeChannel(channel);

    return 0;
}